﻿#导入模块

import pygame
from pygame.locals import *
import time
import random

class HeroPlane:
    '''玩家飞机'''
    def __init__(self,screen_temp):
        self.x=200
        self.y=400
        self.screen=screen_temp
        self.image=pygame.image.load("./images/me.png")
        self.bullet_list=[] #存放玩家子弹
        self.bulletd_list=[] #存放敌机子弹

    def display(self):
        '''绘制玩家飞机'''

        #绘制子弹
        for b in self.bullet_list:
            b.display()
            if b.move():
                self.bullet_list.remove(b)

        #绘制敌机子弹
        for bd in self.bulletd_list:
            bd.display()
            if bd.move():
                self.bulletd_list.remove(bd)

            # 执行碰撞检测
            if bd.x>self.x+12 and bd.x<self.x+92 and bd.y>self.y+20 and bd.y<self.y+60:
                self.bulletd_list.remove(bd)
                return True
                
        self.screen.blit(self.image,(self.x,self.y))

    def move_left(self):
        '''左移动飞机'''
        self.x-=5

        if(self.x<=0):
            self.x=0

    def move_right(self):
        '''右移动飞机'''
        self.x+=5

        if(self.x>=406):
            self.x=406

    def fire(self):
        '''创建子弹'''
        self.bullet_list.append(Bullet(self.screen,self.x,self.y))

    def fire2(self,enemyPlane_temp):
        '''创建子弹'''
        self.bulletd_list.append(BulletDown(self.screen,enemyPlane_temp.x,enemyPlane_temp.y))
        
        
class Bullet:
    '''玩家子弹类'''
    def __init__(self,screen_temp,x,y):
        self.x=x+53
        self.y=y
        self.screen=screen_temp
        self.image=pygame.image.load("./images/pd.png")

    def display(self):
        '''绘制子弹'''
        self.screen.blit(self.image,(self.x,self.y))

    def move(self):
        '''上移动子弹'''
        self.y-=10

        if(self.y<=-20):
            return True

class BulletDown:
    '''敌机子弹类'''
    def __init__(self,screen_temp,x,y):
        self.x=x+51
        self.y=y
        self.screen=screen_temp
        self.image=pygame.image.load("./images/pd2.png")

    def display(self):
        '''绘制子弹'''
        self.screen.blit(self.image,(self.x,self.y))


    def move(self):
        '''下移动子弹'''
        self.y+=6

        if(self.y>=568):
            return True


class EnemyPlane:
    '''敌机类'''
    def __init__(self,screen_temp):
        self.x=random.choice(range(408))
        self.y=-75
        self.screen=screen_temp
        self.image=pygame.image.load("./images/e"+str(random.choice(range(3)))+".png")

    def display(self):
        '''绘制敌机'''
        self.screen.blit(self.image,(self.x,self.y))

    def move(self,hero):
        '''移动敌机'''
        self.y += 4
        #敌机出屏幕
        if self.y>568:
            return True

        # 遍历所有子弹,并执行碰撞检测
        for bo in hero.bullet_list:
            if bo.x>self.x+12 and bo.x<self.x+92 and bo.y>self.y+20 and bo.y<self.y+60:
                hero.bullet_list.remove(bo)
                return True

def key_control(hero_temp):
    '''键盘控制函数'''
    #执行退出操作
    for event in pygame.event.get():
        if event.type==QUIT:
            exit()
    
    #获取按键信息
    pressed_keys= pygame.key.get_pressed()
    
    #做判断，并执行对象的操作
    if pressed_keys[K_LEFT] or pressed_keys[K_a]:
        hero_temp.move_left()

    elif pressed_keys[K_RIGHT] or pressed_keys[K_d]:
        hero_temp.move_right()

    if pressed_keys[K_SPACE]:
        hero_temp.fire()
        
def main():
    '''主程序函数'''

    #创建游戏窗口
    screen= pygame.display.set_mode((512,568),0,0)

    #创建一个游戏背景
    background=pygame.image.load("./images/bg2.jpg")

    #创建玩家飞机
    hero=HeroPlane(screen)

    m=-968
    enemylist = [] #存放敌机的列表
    isDisplay=True
    while True:
        #绘制画面
        screen.blit(background,(0,m))

        m+=2
        if m>=-200:
            m=-968

        #绘制玩家飞机
        if(hero.display()):
            isDisplay=False
            alert=pygame.image.load("./images/over.png")
            screen.blit(alert,(30,160))
            

        #执行键盘控制
        key_control(hero)

        #随机绘制敌机
        if random.choice(range(50))==10:
            enemylist.append(EnemyPlane(screen))

        #移动敌机
        for em in enemylist:
            em.display()
            if em.move(hero):
                enemylist.remove(em)

                #爆炸图片
                background2=pygame.image.load("./images/b.png")
                screen.blit(background2,(em.x,em.y))
                
            #敌机发射子弹
            if random.choice(range(20))==5:
                hero.fire2(em)
                
        #更新显示
        pygame.display.update()

        #定时显示
        time.sleep(0.04)

        if(isDisplay == False):
            exit()

#判断当前是否是主运行程序，并调用
if __name__=="__main__":
    main()
